package com.teacher.hong.socket;

import com.teacher.hong.utils.TokenUtils;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@ServerEndpoint("/webSocket/{token}")
public class WebSocketServer {

    //保存WS客户端会话的集合
    static Map<String, Session> sessionMap = new HashMap<>();


    /**
     * 当有客户端连接到webSocket服务端时触发的方法
     *
     * @param session 连接webSocket服务端的会话
     */
    @OnOpen
    public void onOpen(@PathParam("token") String token, Session session) {
        System.out.println("WebSocketServer open...");
        String account = TokenUtils.verify(token);
        if (account != null) {
            System.out.println("有新客户端连接进来了，account是：" + account);
            sessionMap.put(account, session);
        }
    }

    /**
     * 当客户向webSocket服务器发送消息时触发的方法
     *
     * @param message 就是客户端发送的信息
     */
    @OnMessage
    public void onMessage(@PathParam("token") String token, String message) throws IOException {
        String account = TokenUtils.verify(token);
        System.out.println("account为'" + account + "'客户端发来信息了，信息是：" + message);
        if (message.equals("")) return;

        for (String key : sessionMap.keySet()) {
            if (!key.equals(account)) {    //把自己排除掉，不给自己发信息
                Session session = sessionMap.get(key);
                if (session != null) {
                    session.getBasicRemote().sendText(message);
                    System.out.println("给ID为"+key+"发送信息了.");
                }
            }
        }

//        sessionMap.get(你要定向发信息的接收者ID).getBasicRemote().sendText("发送内容");
    }

    /**
     * 当有客户端关闭/断开webSocket服务端连接时触发的方法
     *
     * @param session
     */
    @OnClose
    public void onClose(@PathParam("token") String token, Session session) {
        String account = TokenUtils.verify(token);
        System.out.println("account为'" + account + "'客户端断开连接了，ID是：" + session.getId());
        sessionMap.remove(account);
    }


    /**
     * 当有客户端与webSocket服务端连接发生异常/错误时触发的方法
     *
     * @param throwable
     */
    @OnError
    public void onError(Throwable throwable) {
        throwable.printStackTrace();
    }

}
